package main

import (
	"fmt"
	"reflect"
)

type person struct {
	name string
	age  int
}

func (p person) sayHello() {
	fmt.Printf("Hello, my name is %!s(MISSING) and I am %!d(MISSING) years old.\n", p.name, p.age)
}
func main() {
	p := person{name: "John", age: 30}
	// 通过反射获取方法信息
	sayHelloMethod := reflect.ValueOf(p).MethodByName("sayHello")
	// 判断方法是否存在

	if sayHelloMethod.IsValid() {
		// 在私有方法上调用 "CanInterface" 以解除私有性
		if !sayHelloMethod.CanInterface() {
			v := reflect.New(reflect.TypeOf(p))
			v.Elem().Set(reflect.ValueOf(p))
			sayHelloMethod = v.MethodByName("sayHello")
		}
		// 调用方法
		sayHelloMethod.Call(nil)
	} else {
		fmt.Println("Method not found.")
	}
}
